package tkinit

import (
	"github.com/go-kratos/kratos/v2/config"
	"github.com/go-kratos/kratos/v2/config/file"
	"github.com/pkg/errors"
	"gopkg.in/yaml.v2"
)

// InitConfigs .
func InitConfigs(confPath string) (config.Config, error) {
	var err error
	configOnce.Do(func() {
		configHandler, err = initConfigs(configPath)
		if err != nil {
			return
		}
	})
	return configHandler, err
}

// Watch .
func Scan(key string, conf interface{}) (err error) {
	handler, err := InitConfigs(ConfigPath())
	if err != nil {
		err = errors.WithStack(err)
		return
	}
	err = handler.Value(key).Scan(conf)
	if err != nil {
		err = errors.WithStack(err)
		return
	}
	return
}

// Watch .
func Watch(key string, observer config.Observer) (err error) {
	handler, err := InitConfigs(ConfigPath())
	if err != nil {
		err = errors.WithStack(err)
		return
	}
	err = handler.Watch(key, observer)
	if err != nil {
		err = errors.WithStack(err)
		return
	}
	return
}

// initConfigs .
func initConfigs(confPath string) (handler config.Config, err error) {
	c := config.New(
		config.WithSource(
			file.NewSource(confPath),
		),
		config.WithDecoder(func(kv *config.KeyValue, v map[string]interface{}) error {
			// kv.Key
			// kv.Value
			// kv.Metadata
			// 自定义实现对应的数据源解析，如果是配置中心数据源也可以指定metadata进行识别配置类型
			return yaml.Unmarshal(kv.Value, v)
		}),
	)
	// 加载配置源：
	if err = c.Load(); err != nil {
		err = errors.WithStack(err)
		return
	}
	return
}
